<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
</body>
</html>
<script>
    
    //数组去重
//去重常见面试题在es6里面有快速简单的方法儿，
//使用new Set()及 Arry.from() 
//或者展开运算符...
var fruits = ['bananer', 'apple', 'orange', 'watermelon', 'apple', 'orange', 'grape', 'apple'];
// 方法一
    var uniqueFruits = Array.from(new Set(fruits));
    console.log(uniqueFruits); // returns    bananer,apple,orange,watermelon,grape
// 方法二  ... 
    //斑点去重 
    var uniqueFruits2 = [...new Set(fruits)];
    console.log(uniqueFruits2); // returns    bananer,apple,orange,watermelon,grape
// 方法三  filter方法儿   
    // var arr = [1, 2, 2, 3, 4, 5, 5, 6, 7, 7,8,8,0,8,6,3,4,56,2];
    var b = a.filter((x, index,self)=>self.indexOf(x)===index) 
    //                 //  (每一项，下标，原数组) 
    // console.log(arr2); //[1, 2, 3, 4, 5, 6, 7, 8, 0, 56]


//数组替换
//日常开发中需要替换或者删除一些指定的数据，遇到这种场景时一定要想到Array.protoType.splice这个方法。
//传参时稍微复杂点，1参数是开始的索引，2参数是删除的数量，剩下的就是需要添加的值（可以是一个或者多个）。
//  参1 删除或添加的位置 参2 要删除几个如果是0则不删除 参3添加值 
var fruits = ['banana', 'apple', 'orange', 'watermelon', 'apple', 'orange', 'grape', 'apple'];
fruits.splice(0, 2, 'potato', 'tomato');
console.log(fruits); // returns ['potato', 'tomato', 'orange', 'watermelon', 'apple', 'orange', 'grape', 'apple']


                                        
//数组遍历   
var friends = [
    { name: 'John',   age: 22 },
    { name: 'Peter',  age: 23 },
    { name: 'Mark',   age: 24 },
    { name: 'Maria',  age: 22 },
    { name: 'Monica', age: 21 },
    { name: 'Martha', age: 19 },
]
var friendsNames = Array.from(friends, ({name}) => name);
console.log(friendsNames); // returns ["John", "Peter", "Mark", "Maria", "Monica", "Martha"]




//清空数组
//有时我们需要清空一个数组，比如用户点击了清空购物车。可以一条一条地删除，
//直接将之length设置成0
var fruits = ['banana', 'apple', 'orange', 'watermelon', 'apple', 'orange', 'grape', 'apple'];
//设置length=0使原数组清除元素
//方法1
    fruits.length = 0;   
//方法20
    fruites = []
    console.log(fruits); // returns []





//填充数组
//创建数组的时候，需要填充上默认值的场景，
//首先想到的就是循环这个数组。ES6提供了更便捷的.fill方法
var newArray = new Array(10).fill('1');
console.log(newArray); // returns ['1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1']




//合并数组 拼接
//如何合并数组吗，答案就是.concat()
//ES6的展开运算符(...)
var fruits = ['apple', 'banana', 'orange'];
var meat = ['poultry', 'beef', 'fish'];
var vegetables = ['potato', 'tomato', 'cucumber'];
var food = [...fruits, ...meat, ...vegetables];
console.log(food); //["apple", "banana", "orange", "poultry", "beef", "fish", "potato", "tomato", "cucumber"]


//两个数组的交集
//找出两个数组的交集算是一道经典的JS面试题了，这题能很好地考察候选人的逻辑是否清晰，
//对数组的掌握是否熟练。这题的答案有很多，下面展示的是ES6的简洁写法
var numOne = [0, 2, 4, 6, 8, 8];
var numTwo = [1, 2, 3, 4, 5, 6];
var duplicatedValues = [...new Set(numOne)].filter(item => numTwo.includes(item));
console.log(duplicatedValues); // returns [2, 4, 6]


//两个数据的差集
let arr1 = [1,2,3,4,5]
let arr2 = [4,5,6,7,8]
let a = new Set(arr1)
let b = new Set(arr2)
let arr3 = new Set(arr1.filter(x=> !b.has(X)));
let arr4 = new Set(arr1.filter(x=> !a.has(X)));
var diff = [...arr3, ...arr4];
console.log(diff) //[1,2,3,6,7,8]


//去除假值
//首先，我们熟悉下假值(falsy values)是什么？在JS中，假值有：false、0、''、null、NaN、undefined。
//现在我们找到这些假值并将它们移除，这里使用的是.filter方法
var mixedArr = [0, 'blue', '', NaN, 9, true, undefined, 'white', false];
var trueArr = mixedArr.filter(Boolean);
console.log(trueArr); // returns ['blue', 9, true, 'white']


//随机值
//从数组中获取随机的一个值，也是一道经典的面试题哦。
//其实考察的核心知识是随机生成一个值x：x >= 0 并且 x < 数组的length
var colors = ['blue', 'white', 'green', 'navy', 'pink', 'purple', 'orange', 'yellow', 'black', 'brown'];
var randomColor = colors[(Math.floor(Math.random() * (colors.length)))] 
console.log(randomColor)    //随机某一个


//倒序
//怎么对数组进行倒序？只需要一行代码
var colors = ['blue', 'white', 'green', 'navy', 'pink', 'purple', 'orange', 'yellow', 'black', 'brown'];
var reversedColors = colors.reverse();
// 或者 colors.slice().reverse();
// 两者有啥区别？
console.log(reversedColors); // returns ["brown", "black", "yellow", "orange", "purple", "pink", "navy", "green", "white", "blue"]



//lastIndexOf()
//很多时候我们查找元素是否存在于某个数组中，经常使用indexOf方法，
//常常忽略lastIndexOf方法，后者会被使用的一个场景就是，某个数组中有重复的数据。
var nums = [1, 5, 2, 6, 3, 5, 2, 3, 6, 5, 2, 7];
var lastIndex = nums.lastIndexOf(5);
console.log(lastIndex); // returns 9



//数组求和
//对数组中的所有元素进行求
//这里使用的是reduce，reduce汇总。用处很多。
var nums = [1, 5, 2, 6];
//reduce求和
    var sum = nums.reduce((x, y) => x + y);   //汇总
    console.log(sum); // returns 14


//循环求和
    var num = 0;
    nums.forEach(function(item, index){
        num +=item
    })
    console.log(num) // returns 14


// 如果我们使⽤JavaScript的"关联数组"，我们怎 么计算"关联数组"的⻓度
//其实答案很简单，直接计算key的数量就可以了
var counterArray = {     A : 3,     B : 4 };    
counterArray["C"] = 1;
Object.keys(counterArray).length // Output 3

</script>